Debugger = require("SharedLibs/Debugger");

function _getModulePath(module)
	local path = module.Name;
	local parent = module.Parent;
	while parent do
		path = parent.Name.."."..path;
		parent = parent.Parent;
	end

	return path;
end

function _typeof(obj)
	return obj.__name;
end

--[[
	Core提供一些和组件, 复用相关的底层支持, 例如
	1. Reflection
	2. Prefab
	
]]
local m = {}

--- Components' classes
_ClassMap = {};

function m.IsClassRegistered(cls)
	return _ClassMap[_typeof(cls)] ~= nil;
end

--- 如果name对应的class不存在, 则返回fallback
function m.GetClass(name, fallback)
	assert(name);
	local cls = _ClassMap[name];
	if cls then return cls
	else return fallback; end
end

--- 用来支持反射。
--- 注意：通过RegisterClass注册的类不一定能通过m.Create创建。
function m.RegisterClass(clazz)
	assert(clazz);
	assert(clazz.new);
	if not _typeof(clazz) then
		error("Must has class name!");
	end
	local clsName = _typeof(clazz);
	
	-- if not _ClassMap[clsName] then
	-- 	_ClassMap[clsName] = clazz;
	-- end

	if _ClassMap[clsName] then
		if Debugger.IsStudio then
			error("Duplicate registration, class name: ".._typeof(clazz));
		else
			warn("Duplicate registration, class name: ".._typeof(clazz));
		end
	end

	_ClassMap[clsName] = clazz;
end

-- --- 获取文件名和行号, 如果是1, 则返回当前调用GetFileNameAndLine的文件名和行号
-- --- 2则返回上一级的. 依此类推
-- function m.GetFileNameAndLine(level)
-- 	local fileName, line = debug.info(level + 1, "sl")
-- 	--- 找到最后一个.号后的文件名. 这个正则由ChatGPT生成, 可以直接问GPT其含义
-- 	fileName = string.match(fileName, "%.([^%.]+)$");
-- 	return fileName, line;
-- end

return m;